package com.tbit.main.dao.core;

import com.tbit.main.pojo.*;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 设备最后状态
 *
 * @author Leon
 * 2019年11月11日 上午10:56:37
 */
public interface MachineStatusDao {

    /**
     * 根据设备id查询
     *
     * @param machineId
     * @return
     */
    MachineStatus getByMachineId(Integer machineId);

    /**
     * 根据设备id批量查询 设备最后状态
     *
     * @param params
     * @return
     */
    List<MachineStatus> getByMachineIdBatch(Map<String, Object> params);

    /**
     * 根据设备id批量查询 设备最后借出信息
     *
     * @param params
     * @return
     */
    List<MachineStatusBorrow> getBorrowByMachineIds(Map<String, Object> params);

    /**
     * 根据代理商id查询
     *
     * @param accountId
     * @return
     */
    List<MachineStatus> getByAccountId(Integer accountId);

    /**
     * 根据代理商id查询
     *
     * @param regionId
     * @return
     */
    List<MachineStatus> getByRegionIds(@Param("regionId") String regionId);

    /**
     * 查询代理商低电量设备
     *
     * @param params
     * @return
     */
    List<MachineStatus> getSocByAccountId(Map<String, Object> params);

    /**
     * 查询指定区域指定区间电量设备
     *
     * @param params
     * @return
     */
    List<MachineStatus> getSocByKey(Map<String, Object> params);

    /**
     * 查询指定区间分区电量
     *
     * @param params
     * @return
     */
    List<MachineStatus> getSocByRegionIdAndKey(Map<String, Object> params);

    /**
     * 查询代理商低电量设备
     *
     * @param params
     * @return
     */
    List<MachineStatus> getSocByAccountIds(Map<String, Object> params);

    /**
     * 查询分区低电量设备
     *
     * @param params
     * @return
     */
    List<MachineStatus> getSocByRegionId(Map<String, Object> params);

    /**
     * 查询代理商低电量设备总数
     *
     * @param params
     * @return
     */
    Integer getSocByAccountIdCount(Map<String, Object> params);

    /**
     * 获取状态和最后借出信息
     *
     * @param params
     * @return
     */
    List<MachineStatusBorrow> getUnUseByAccountId(Map<String, Object> params);

    /**
     * 获取状态和最后借出信息
     *
     * @param params
     * @return
     */
    List<MachineStatusBorrow> getUnUseByRegionId(Map<String, Object> params);

    /**
     * 获取状态和最后借出信息
     *
     * @param params
     * @return
     */
    List<MachineStatusBorrow> getUnUseByStartEnd(Map<String, Object> params);

    /**
     * 获取状态和最后借出信息
     *
     * @param params
     * @return
     */
    List<MachineStatusBorrow> getRegionByStartEnd(Map<String, Object> params);


    /**
     * 查询闲置时长区间的设备
     *
     * @param params 查询参数
     * @return 闲置时长区间的设备
     */
    List<MachineStatusBorrow> selectAccountIdleTimeByStartEnd(Map<String, Object> params);

    /**
     * 查询闲置时长区间的设备
     *
     * @param params 查询参数
     * @return 闲置时长区间的设备
     */
    List<MachineStatusBorrow> selectRegionIdIdleTimeByStartEnd(Map<String, Object> params);

    /**
     * 获取状态和最后借出信息
     *
     * @return
     */
    List<MachineStatusBorrow> getStatusAll();

    /**
     * 查询代理商故障设备
     *
     * @param params
     * @return
     */
    List<MachineStatus> getFaultByAccountId(Map<String, Object> params);

    /**
     * 查询分区故障设备
     *
     * @param params
     * @return
     */
    List<MachineStatus> getFaultByRegionId(Map<String, Object> params);

    /**
     * 根据运营区域时间批量查询
     *
     * @param list
     * @return
     */
    List<MachineStatusBorrow> getUnUseByAccountIdList(List<OrderJob> list);

    /**
     * 根据运营区域批量查询
     *
     * @param listAccountId
     * @return
     */
    List<MachineStatus> getByListAccountId(List<Integer> listAccountId);


    /**
     * 根据运营区域id批量查询
     *
     * @param accountId
     * @return
     */
    List<Machine> getByAccountIdAll(List<Integer> accountId);

    /**
     * 获取运营区域内缺电的车辆数
     *
     * @return
     */
    List<Map<String, Object>> getGroupByAccountIdLockPower();

    /**
     * 根据最后上报定位时间查询
     *
     * @param posDt
     * @return
     */
    List<Integer> getByPosDt(String posDt);

    /**
     * 根据区域
     *
     * @param map
     * @return
     */
    List<MachineStatus> getAccountIdsPosDt(Map<String, Object> map);

    /**
     * 根据最后心跳时间查询
     *
     * @param map
     * @return
     */
    List<Machine> getByBatDt(Map<String, Object> map);

    Integer getByBatDtId(Map<String, Object> map);

    /**
     * 根据最后上报定位时间,运营区域id查询
     *
     * @param map
     * @return
     */
    List<Machine> getByAccountIdPosDt(Map<String, Object> map);

    /**
     * 获取所有车辆状态
     *
     * @return
     */
    List<MachineStatus> getMachineStatusAll();

    /**
     * 查询流入流出车辆
     *
     * @param map
     * @return
     */
    List<MachineStatus> getStream(Map<String, Object> map);

    /**
     * 查询流入流出车辆
     *
     * @param map
     * @return
     */
    List<MachineStatus> getStreams(Map<String, Object> map);

    /**
     * 根据区域查询未分区车辆
     *
     * @param map
     * @return
     */
    List<MachineStatus> getAccountIdNotRegionId(Map<String, Object> map);

    /**
     * 查询区域内在骑车辆状态
     *
     * @param map
     * @return
     */
    List<Integer> getAccountIdBorrow(Map<String, Object> map);

    /**
     * 查询设备是否低电
     *
     * @param map
     * @return
     */
    List<Integer> getExist(Map<String, Object> map);

    void updateStatus(Map<String, Object> map);

    /**
     * 添加
     *
     * @param map
     */
    void insert(Map<String, Object> map);

    /**
     * 批量修改定位
     * @param machineStatusPosList 修改信息
     */
    void updateStatusPosBatch(List<MachineStatusPos> machineStatusPosList);

    /**
     * 查询自定义标签
     *
     */
    List<MachineStatus> getByTag(@Param("params") Map<String, Object> params);

    /**
     * 无定位
     */
    List<MachineStatus> selectLongTermNonPos(Map<String, Object> params);

    /**
     * 长时订单
     */
    List<MachineStatus> selectLongOrder(Map<String, Object> params);

    /**
     * 无订单
     * @param accountId 区域id
     * @param regionId  分区id
     * @param hours 小时
     * @return  List<MachineStatus>
     */
    List<MachineStatus> getNoOrder(@Param("accountId") Integer accountId, @Param("regionId") List<Integer> regionId, @Param("hours") Integer hours);
}